﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using TCC_Hotel.Repositorio;
using TCC_Hotel.Entidades;
using System.Web.Caching;

namespace TCC_Hotel.Serviços.BDServices
{
    public class HospedeService
    {
        HospedeRepositorio repositorio = new HospedeRepositorio();

        /// <summary>
        /// Serviço para inserir um hóspede particular nos bancos
        /// </summary>
        /// <param name="funcionario">Hóspede que será inserido</param>
        /// <returns>True se foi inserido ou false se nao</returns>
        public bool CadastrarHospedeParticular(HospedeParticular hospede)
        {
            return repositorio.CadastrarHospedeParticular(hospede);

        }

        /// <summary>
        /// Serviço para inserir um hóspede faturado nos bancos
        /// </summary>
        /// <param name="funcionario">Hóspede que será inserido</param>
        /// <returns>True se foi inserido ou false se nao</returns>
        public bool CadastrarHospedeFaturado(HospedeFaturado hospede)
        {
            return repositorio.CadastrarHospedeFaturado(hospede);

        }

        /// <summary>
        /// Serviço para listar todos os hospedes faturados do banco
        /// </summary>
        /// <returns>Lista com os hospedes faturados do banco</returns>
        public List<HospedeFaturado> RecuperarHospedesFaturados()
        {
            return repositorio.RecuperarHospedesFaturados();

        }

        /// <summary>
        /// Serviço para listar todos os hospedes particulares do banco
        /// </summary>
        /// <returns>Lista com os hospedes particulares do banco</returns>
        public List<HospedeParticular> RecuperarHospedesParticulares()
        {
            return repositorio.RecuperarHospedesParticulares();

        }

        /// <summary>
        /// Serviço para que recupera um hospede particular do banco
        /// </summary>
        /// <returns>hospede particular do banco</returns>
        public HospedeParticular RecuperarDetalhesHospedeParticular(string CPF)
        {
            return repositorio.RecuperarDetalhesHospedeParticular(CPF);

        }

        /// <summary>
        /// Serviço para que recupera um hospede faturado do banco
        /// </summary>
        /// <returns>hospede faturado do banco</returns>
        public HospedeFaturado RecuperarDetalhesHospedeFaturado(string CPF)
        {
            return repositorio.RecuperarDetalhesHospedeFaturado(CPF);

        }

        /// <summary>
        /// Serviço para que recupera um hospede particular por RG do banco
        /// </summary>
        /// <returns>hospede particular do banco</returns>
        public HospedeParticular RecuperarDetalhesHospedeParticularPorRG(string RG)
        {
            return repositorio.RecuperarDetalhesHospedeParticularPorRG(RG);

        }

        /// <summary>
        /// Serviço para que recupera um hospede faturado por RG do banco
        /// </summary>
        /// <returns>hospede faturado do banco</returns>
        public HospedeFaturado RecuperarDetalhesHospedeFaturadoPorRG(string RG)
        {
            return repositorio.RecuperarDetalhesHospedeFaturadoPorRG(RG);

        }

        /// <summary>
        /// Serviço para editar um hospede faturado dos bancos 
        /// </summary>
        /// <returns>true se editou e false se nao</returns>
        public bool EditarHospedeFaturado(string CPF, HospedeFaturado hospede)
        {
            return repositorio.EditarHospedeFaturado(CPF, hospede);
        }

        /// <summary>
        /// Serviço que verifica se o RG já está cadastrado
        /// </summary>
        /// <returns>true se editou e false se nao</returns>
        public bool VerificarRGCadastradoFaturado(string RG, string RGAtual = "0")
        {
            HospedeFaturado hospede = repositorio.RecuperarDetalhesHospedeFaturadoPorRG(RG);
            if (hospede != null)
            {
                 if (hospede.RG == RGAtual)
                {
                    return true;
                }
                else
                {
                    return false;
                }    
            }
            else
                return true;
        }

        /// <summary>
        /// Serviço que verifica se o RG já está cadastrado
        /// </summary>
        /// <returns>true se editou e false se nao</returns>
        public bool VerificarRGCadastradoParticular(string RG, string RGAtual = "0")
        {
            HospedeParticular hospede = repositorio.RecuperarDetalhesHospedeParticularPorRG(RG);
            if (hospede != null)
            {
                if (hospede.RG == RGAtual)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
                return true;
        }

        /// <summary>
        /// Serviço para verificar se o hospede já esta cadastrado
        /// </summary>
        /// <returns>true se esta cadastrado e false se nao</returns>
        public bool VerificaCadastro(string RG, int tipoHospede)
        {
            //hospede particular
            if(tipoHospede == 1)
            {
                List<string> RGs = ListarHospedesParticularesCache().Select(i => i.RG).ToList();
                //verifica se o RG já esta cadastrado
                if (RGs.Contains(RG))
                {
                    return true;
                }
            }
            //hospede particular
            if (tipoHospede == 2)
            {
                List<string> RGs = ListarHospedesFaturadosCache().Select(i => i.RG).ToList();
                //verifica se o RG já esta cadastrado
                if (RGs.Contains(RG))
                {
                    return true;
                }
            }
            return false;
        }

        /// <summary>
        /// Serviço para editar um hospede particular dos bancos 
        /// </summary>
        /// <returns>true se editou e false se nao</returns>
        public bool EditarHospedeParticular(string CPF, HospedeParticular hospede)
        {
            return repositorio.EditarHospedeParticular(CPF, hospede);
        }

         /// <summary>
        /// Verifica se a informação ja esta gravada em cache, se tiver recupera, 
        /// senao faz a consulta e grava em cache
        /// </summary>
        /// <returns>Lista de funcionarios</returns>
        public List<HospedeFaturado> ListarHospedesFaturadosCache()
        {
            List<HospedeFaturado> listaHospedeFaturado = new List<HospedeFaturado>();

            //Verifica se a informação esta guardada em cache
            if (HttpContext.Current.Cache.Get("Lista_Hospedes_Faturados") == null)
            {
                //Consulta os hóspedes faturados no banco
                listaHospedeFaturado = RecuperarHospedesFaturados();

                //Armazena a lista de hóspedes faturados em cache de 1 minuto para evitar muitas consultas ao banco
                HttpContext.Current.Cache.Add("Lista_Hospedes_Faturados", listaHospedeFaturado, null,
                                 DateTime.Now.AddMinutes(5), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
               

            }

           //caso essa informaçao ja estiver no cache
            else
            {
                //Resgata informação do cache
                listaHospedeFaturado = (List<HospedeFaturado>)HttpContext.Current.Cache.Get("Lista_Hospedes_Faturados");
            }
            return listaHospedeFaturado;
        }


        /// <summary>
        /// Verifica se a informação ja esta gravada em cache, se tiver recupera, 
        /// senao faz a consulta e grava em cache
        /// </summary>
        /// <returns>Lista de funcionarios</returns>
        public List<HospedeParticular> ListarHospedesParticularesCache()
          {

              List<HospedeParticular> listaHospedeParticular = new List<HospedeParticular>();

              //Verifica se a informação esta guardada em cache
              if (HttpContext.Current.Cache.Get("Lista_Hospedes_Particulares") == null)
              {
                  //Consulta os hóspedes particulares no banco
                  listaHospedeParticular = RecuperarHospedesParticulares();

                  //Armazena a lista de hóspedes particulares em cache de 1 minuto para evitar muitas consultas ao banco
                  HttpContext.Current.Cache.Add("Lista_Hospedes_Particulares", listaHospedeParticular, null,
                                   DateTime.Now.AddMinutes(5), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
              }

             //caso essa informaçao ja estiver no cache
              else
              {
                  //Resgata informação do cache
                  listaHospedeParticular = (List<HospedeParticular>)HttpContext.Current.Cache.Get("Lista_Hospedes_Particulares");
              }

              return listaHospedeParticular;
          }
        
    }
}